package br.unidocs.web.bean;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.html.HtmlDataTable;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;

import org.apache.log4j.Logger;

import br.unidocs.enums.EnumTipoUsuario;
import br.unidocs.exceptions.UsuarioInvalidoException;
import br.unidocs.modelo.entidade.Usuario;
import br.unidocs.servico.UsuarioEJB;

public class GerenciaUsuarioBackingBean {
	private static Logger log = Logger
			.getLogger(GerenciaUsuarioBackingBean.class);

	private List<Usuario> usuarios = null;

	@EJB
	// falamos para o servidor, crie e insira aqui, para nao criar na mao;
	private UsuarioEJB usuarioEjb;

	private HtmlDataTable tabelaUsuarios;

	// Variaveis para selecao de usuario
	private Usuario usuarioSelecionado;

	// Variaveis para exclusao de arquivo
	private Usuario usuarioParaExclusao;

	// private Usuario usuarioParaDetalhamento;

	public List<Usuario> getUsuarios() {
		if (usuarios == null) {
			usuarios = usuarioEjb.listaUsuarios();
		}
		return usuarios;
	}

	public String selecionaUsuarioParaAlteracao() {
		usuarioSelecionado = (Usuario) tabelaUsuarios.getRowData();
		return "alterarUsuario";
	}

	public String alteraUsuario() {

		usuarioEjb.atualizaUsuario(usuarioSelecionado);

		usuarios = null;
		return "voltar";
	}

	public String confirmaExclusao() {
		usuarioParaExclusao = (Usuario) tabelaUsuarios.getRowData();
		return "confirmaExclusaoUsuario";
	}

	public String excluiUsuarioSelecionado() {
		// Chama o servico de exclusao
		usuarioEjb.excluiUsuario(usuarioParaExclusao);
		return "voltar";
	}

	public String selecionaUsuarioParaDetalhamento() {
		usuarioSelecionado = (Usuario) tabelaUsuarios.getRowData();
		return "detalheUsuario";
	}

	public List<SelectItem> getTiposUsuario() {
		List<SelectItem> tipos = new ArrayList<SelectItem>();
		for (EnumTipoUsuario tipo : EnumTipoUsuario.values()) {
			tipos.add(new SelectItem(tipo, tipo.getDescricao()));
		}
		return tipos;
	}

	public void validaLogin(FacesContext ctx, UIComponent component,
			Object value) {
		// Verifica se não há algum outro usuário com o mesmo login
		try {
			Usuario u = usuarioEjb.localizaPorLogin(value.toString());
			if (u != null && u.getId() != usuarioSelecionado.getId()) {
				ctx.addMessage(component.getClientId(), new FacesMessage(
						"Login invalido.", "O login " + value.toString()
								+ " já está cadastrado para outro usuário."));
				ctx.validationFailed();
				ctx.renderResponse();
			}
		} catch (UsuarioInvalidoException e) {
			ctx.addMessage(
					component.getClientId(),
					new FacesMessage(
							"Login invalido.",
							"O login "
									+ value.toString()
									+ " não é válido. Já existe outro usuário com este login."));
			ctx.validationFailed();
			ctx.renderResponse();
		}
	}

	public void validaEmail(FacesContext ctx, UIComponent component,
			Object value) {
		log.debug("Validando o email " + value.toString());
		// Valida a estrutura do email. Ex: nome@subdominio.dominio
		try {
			new InternetAddress(value.toString(), true);
		} catch (AddressException e) {
			ctx.addMessage(component.getClientId(), new FacesMessage(
					"e-mail inválido.", "O e-mail " + value.toString()
							+ " não é válido."));
			ctx.validationFailed();
			ctx.renderResponse();
		}

		// Verifica se não há algum outro usuário com o mesmo e-mail
		try {
			Usuario u = usuarioEjb.localizaPorEmail(value.toString());
			if (u != null && u.getId() != usuarioSelecionado.getId()) {
				ctx.addMessage(component.getClientId(), new FacesMessage(
						"e-mail inválido.", "O e-mail " + value.toString()
								+ " já está cadastrado para outro usuário."));
				ctx.validationFailed();
				ctx.renderResponse();
			}
		} catch (UsuarioInvalidoException e) {
			ctx.addMessage(component.getClientId(), new FacesMessage(
					"e-mail inválido.", "O e-mail " + value.toString()
							+ " não é válido."));
			ctx.validationFailed();
			ctx.renderResponse();
		}
	}

	public HtmlDataTable getTabelaUsuarios() {
		return tabelaUsuarios;
	}

	public void setTabelaUsuarios(HtmlDataTable tabelaUsuarios) {
		this.tabelaUsuarios = tabelaUsuarios;
	}

	public void setUsuarios(List<Usuario> usuarios) {
		this.usuarios = usuarios;
	}

	public Usuario getUsuarioParaExclusao() {
		return usuarioParaExclusao;
	}

	public void setUsuarioParaExclusao(Usuario usuarioParaExclusao) {
		this.usuarioParaExclusao = usuarioParaExclusao;
	}

	public Usuario getUsuarioSelecionado() {
		return usuarioSelecionado;
	}

	public void setUsuarioSelecionado(Usuario usuarioSelecionado) {
		this.usuarioSelecionado = usuarioSelecionado;
	}

	// public Usuario getUsuarioParaDetalhamento() {
	// return usuarioParaDetalhamento;
	// }
	//
	// public void setUsuarioParaDetalhamento(Usuario usuarioParaDetalhamento) {
	// this.usuarioParaDetalhamento = usuarioParaDetalhamento;
	// }

}
